<?php


namespace paySdk\functions\postar\lib\Request\Body\Order;


class Order
{

    /* --- 必须参数 -------------------------------------------------------------------------------------------------- */
    // 机构号
    protected $agent_id;
    // 商户号
    protected $customer_id;
    // 接入方式 0:Android SDK 1:iOS SDK 2:windows SDK 3:直连。默认3
    protected $access = 3;
    // 时间戳，格式yyyyMMddHHmmss
    protected $timestamp;
    // 版本号，可选值：1.0.0和2.0.0
    protected $version = "1.0.0";

    // 商户订单号，同一商户必须唯一。由数字，大小写字母构成。（前8位必须是日期，即yyyyMMdd）
    protected $order_no;
    // 设备号
    protected $device_no;
    // 订单金额（单位分）
    protected $tx_amt;
    // 原订单金额（单位分）
    protected $tx_amt_order;
    // 消费者ip
    protected $client_ip;
    // 微信是openid，支付宝是用户唯一用户号userId的值，银联是用户标识userId的值
    // 根据微信、支付宝、银联给出的官方文档获取
    protected $open_id;
    // 支付方式: 1.微信支付（小程序） 2.支付宝支付 3.银联支付，默认微信支付
    protected $pay_way = 1;

    /* --- 微信支付 必须参数 ------------------------------------------------------------------------------------------- */
    // 微信公众账号appid
    protected $wechat_app_id;
    // 在授权回调页面获取到的授权code
    protected $wechat_access_code;
    // 微信设备号
    protected $wechat_device_no;
    // 订单超时时间
    protected $wechat_order_timeout;
    // 小程序订单号
    protected $prd_order_no;
    // 小程序ID
    protected $wechat_mini_program_id;
    // 交易类型：5公众号 8小程序 (微信支付必传)
    protected $trade_type;

    /* --- 支付宝 必须参数 -------------------------------------------------------------------------------------------- */
    // 支付宝appid
    protected $alipay_app_id;
    // 买家账号
    protected $alipay_buyer_account;
    // 分期数，分期业务必传。星pos专用
    protected $stage_num;
    // 支付宝pid，分期业务时必传。星pos专用
    protected $pid;

    /* --- 银联支付必须参数 -------------------------------------------------------------------------------------------- */
    // 获取银联用户标识时有返回(银联支付必传)
    protected $atq_tag;
    // 手机号(银联支付必传)
    protected $customer_login;
    // 银联授权码（银联支付 必传）。星pos专用
    protected $user_auth_code;
    // 银联支付标志: UnionPay/1.0 CloudPay（银联支付 必传）。星pos专用
    protected $pay_code;
    // 商店编号（银联支付必传）。星pos专用
    protected $store_id;

    /* --- 非必须参数 ------------------------------------------------------------------------------------------------- */
    // 订单标题
    protected $title;
    // 备注，订单说明
    protected $remark;
    // 纬度
    protected $lat;
    // 经度
    protected $lng;
    // 操作员号
    protected $operator;
    // 指定支付方式，0-不限制，1-不能使用信用卡，微信可用（微信支付）。默认1
    protected $limit_pay;
    // 附加字段。星pos专用
    protected $attach;

    public $available_parameters = ["agent_id", "customer_id", "pay_way", "order_no", "device_no", "tx_amt",
        "tx_amt_order", "client_ip", "timestamp"];
    public $parameters_from_caller;
    public $valid = false;

    /**
     * 校验参数
     * @throws \Exception
     */
    public function chkParam() {
        // 取$this->available_parameters与$this->parameters差集，判断是否有必须参数没有被传入
        if ([] !== $arr = array_diff($this->available_parameters, array_keys($this->parameters_from_caller)))
            throw new \Exception("取少必须参数参数(" . implode(",", $arr) . ")");

        $this->valid = true;
    }

    /**
     * @param string $name
     * @param string $val
     */
    public function __set(string $name, string $val) {
        $this->$name = $val;
        if (! isset($this->parameters_from_caller[$name]))
            $this->parameters_from_caller[$name] = $val;
    }

    /**
     * @param string $name
     * @return mixed
     */
    public function __get(string $name) {
        return $this->$name;
    }
}